guint permanent : 1;
} Texture;
-typedef struct {
- GLuint vao_id;
- GLuint buffer_id;
- GLuint position_id;
- GLuint uv_id;
- GskQuadVertex *quads;
- int n_quads;
- guint in_use : 1;
- guint permanent : 1;
-} Vao;
-
typedef struct {
GLuint fbo_id;
GLuint depth_stencil_id;
Fbo default_fbo;
GHashTable *textures;
- GHashTable *vaos;
const Texture *bound_source_texture;
const Texture *bound_mask_texture;
- const Vao *bound_vao;
const Fbo *bound_fbo;
int max_texture_size;
glDeleteFramebuffers (1, &f->fbo_id);
}
-static Vao *
-vao_new (void)
-{
- return g_slice_new0 (Vao);
-}
-
-static void
-vao_free (gpointer data)
-{
- Vao *v = data;
-
- g_free (v->quads);
- glDeleteBuffers (1, &v->buffer_id);
- glDeleteVertexArrays (1, &v->vao_id);
- g_slice_free (Vao, v);
-}
-
static void
gsk_gl_driver_finalize (GObject *gobject)
{
gdk_gl_context_make_current (self->gl_context);
g_clear_pointer (&self->textures, g_hash_table_unref);
- g_clear_pointer (&self->vaos, g_hash_table_unref);
g_clear_object (&self->profiler);
if (self->gl_context == gdk_gl_context_get_current ())
gsk_gl_driver_init (GskGLDriver *self)
{
self->textures = g_hash_table_new_full (NULL, NULL, NULL, texture_free);
- self->vaos = g_hash_table_new_full (NULL, NULL, NULL, vao_free);
self->max_texture_size = -1;
self->bound_source_texture = NULL;
self->bound_mask_texture = NULL;
- self->bound_vao = NULL;
self->bound_fbo = NULL;
self->default_fbo.fbo_id = 0;
gsk_profiler_counter_get (self->profiler, self->counters.reused_textures),
gsk_profiler_counter_get (self->profiler, self->counters.surface_uploads)));
GSK_NOTE (OPENGL,
- g_print ("*** Frame end: textures=%d, vaos=%d\n",
- g_hash_table_size (self->textures),
- g_hash_table_size (self->vaos)));
+ g_print ("*** Frame end: textures=%d\n",
+ g_hash_table_size (self->textures)));
self->in_frame = FALSE;
}
return old_size - g_hash_table_size (driver->textures);
}
-int
-gsk_gl_driver_collect_vaos (GskGLDriver *driver)
-{
- GHashTableIter iter;
- gpointer value_p = NULL;
- int old_size;
-
- g_return_val_if_fail (GSK_IS_GL_DRIVER (driver), 0);
- g_return_val_if_fail (!driver->in_frame, 0);
-
- old_size = g_hash_table_size (driver->vaos);
-
- g_hash_table_iter_init (&iter, driver->vaos);
- while (g_hash_table_iter_next (&iter, NULL, &value_p))
- {
- Vao *v = value_p;
-
- if (v->in_use)
- v->in_use = FALSE;
- else
- g_hash_table_iter_remove (&iter);
- }
-
- return old_size - g_hash_table_size (driver->vaos);
-}
-
int
gsk_gl_driver_get_max_texture_size (GskGLDriver *driver)
{
return NULL;
}
-static Vao *
-gsk_gl_driver_get_vao (GskGLDriver *driver,
- int vao_id)
-{
- Vao *v;
-
- if (g_hash_table_lookup_extended (driver->vaos, GINT_TO_POINTER (vao_id), NULL, (gpointer *) &v))
- return v;
-
- return NULL;
-}
-
static Fbo *
gsk_gl_driver_get_fbo (GskGLDriver *driver,
int texture_id)
return t->texture_id;
}
-static Vao *
-find_vao (GHashTable *vaos,
- int position_id,
- int uv_id,
- int n_quads,
- GskQuadVertex *quads)
-{
- GHashTableIter iter;
- gpointer value_p = NULL;
-
- g_hash_table_iter_init (&iter, vaos);
- while (g_hash_table_iter_next (&iter, NULL, &value_p))
- {
- Vao *v = value_p;
-
- if (v->position_id != position_id || v->uv_id != uv_id)
- continue;
-
- if (v->n_quads != n_quads)
- continue;
-
- if (memcmp (v->quads, quads, sizeof (GskQuadVertex) * n_quads) == 0)
- return v;
- }
-
- return NULL;
-}
-
-void
-gsk_gl_driver_create_permanent_vao_for_quad (GskGLDriver *driver,
- int n_vertices,
- const GskQuadVertex *quads,
- int *out_vao_id,
- int *out_vao_buffer_id)
-{
- GLuint vao_id, buffer_id;
-
- glGenVertexArrays (1, &vao_id);
- glBindVertexArray (vao_id);
-
- glGenBuffers (1, &buffer_id);
- glBindBuffer (GL_ARRAY_BUFFER, buffer_id);
- glBufferData (GL_ARRAY_BUFFER, sizeof (GskQuadVertex) * n_vertices, quads, GL_STATIC_DRAW);
-
- glBindBuffer (GL_ARRAY_BUFFER, 0);
- glBindVertexArray (0);
-
- *out_vao_id = buffer_id;
- *out_vao_buffer_id = vao_id;
-}
-
-int
-gsk_gl_driver_create_vao_for_quad (GskGLDriver *driver,
- int position_id,
- int uv_id,
- int n_vertices,
- GskQuadVertex *quads)
-
-{
- GLuint vao_id, buffer_id;
- Vao *v;
-
- g_return_val_if_fail (GSK_IS_GL_DRIVER (driver), -1);
- g_return_val_if_fail (driver->in_frame, -1);
-
- v = find_vao (driver->vaos, position_id, uv_id, n_vertices, quads);
- if (v != NULL && !v->in_use)
- {
- GSK_NOTE (OPENGL, g_print ("Reusing VAO(%d)\n", v->vao_id));
- v->in_use = TRUE;
- return v->vao_id;
- }
-
- glGenVertexArrays (1, &vao_id);
- glBindVertexArray (vao_id);
-
- glGenBuffers (1, &buffer_id);
- glBindBuffer (GL_ARRAY_BUFFER, buffer_id);
- glBufferData (GL_ARRAY_BUFFER, sizeof (GskQuadVertex) * n_vertices, quads, GL_STATIC_DRAW);
-
- if (position_id != -1)
- {
- glEnableVertexAttribArray (position_id);
- glVertexAttribPointer (position_id, 2, GL_FLOAT, GL_FALSE,
- sizeof (GskQuadVertex),
- (void *) G_STRUCT_OFFSET (GskQuadVertex, position));
- }
-
- if (uv_id != -1)
- {
- glEnableVertexAttribArray (uv_id);
- glVertexAttribPointer (uv_id, 2, GL_FLOAT, GL_FALSE,
- sizeof (GskQuadVertex),
- (void *) G_STRUCT_OFFSET (GskQuadVertex, uv));
- }
-
- glBindBuffer (GL_ARRAY_BUFFER, 0);
- glBindVertexArray (0);
-
- v = vao_new ();
- v->vao_id = vao_id;
- v->buffer_id = buffer_id;
- v->position_id = position_id;
- v->uv_id = uv_id;
- v->n_quads = n_vertices;
- v->quads = g_memdup (quads, sizeof (GskQuadVertex) * n_vertices);
- v->in_use = TRUE;
- g_hash_table_insert (driver->vaos, GINT_TO_POINTER (vao_id), v);
-
-#ifdef G_ENABLE_DEBUG
- if (GSK_DEBUG_CHECK (OPENGL))
- {
- int i;
- g_print ("New VAO(%d) for quad[%d] : {\n", v->vao_id, n_vertices);
- for (i = 0; i < n_vertices; i++)
- {
- g_print (" { x:%.2f, y:%.2f } { u:%.2f, v:%.2f }\n",
- quads[i].position[0], quads[i].position[1],
- quads[i].uv[0], quads[i].uv[1]);
- }
- g_print ("}\n");
- }
-#endif
-
- return vao_id;
-}
-
int
gsk_gl_driver_create_render_target (GskGLDriver *driver,
int texture_id,
}
}
-void
-gsk_gl_driver_bind_vao (GskGLDriver *driver,
- int vao_id)
-{
- Vao *v;
-
- g_return_if_fail (GSK_IS_GL_DRIVER (driver));
- g_return_if_fail (driver->in_frame);
-
- v = gsk_gl_driver_get_vao (driver, vao_id);
- if (v == NULL)
- {
- g_critical ("No VAO %d found.", vao_id);
- return;
- }
-
- if (driver->bound_vao != v)
- {
- glBindVertexArray (v->vao_id);
- glBindBuffer (GL_ARRAY_BUFFER, v->buffer_id);
-
- if (v->position_id != -1)
- glEnableVertexAttribArray (v->position_id);
-
- if (v->uv_id != -1)
- glEnableVertexAttribArray (v->uv_id);
-
- driver->bound_vao = v;
- }
-}
-
gboolean
gsk_gl_driver_bind_render_target (GskGLDriver *driver,
int texture_id)
g_hash_table_remove (driver->textures, GINT_TO_POINTER (texture_id));
}
-void
-gsk_gl_driver_destroy_vao (GskGLDriver *driver,
- int vao_id)
-{
- g_return_if_fail (GSK_IS_GL_DRIVER (driver));
-
- g_hash_table_remove (driver->vaos, GINT_TO_POINTER (vao_id));
-}
-
static void
gsk_gl_driver_set_texture_parameters (GskGLDriver *driver,
int min_filter,